import lodash from 'lodash';
import {
    convertSecToMinAndSec,
    createAGroupFolder,
    getCurrentDate,
    getPlayerData,
    isGroupExist,
    isPlayerExist,
    readConfiguration,
    storagePlayerData,
    timestampToSeconds
} from '../function/function.js';

export class Bs extends plugin {
    constructor() {
        super({
            name: '[Bs]吃面包',
            dsc: '吃面包',
            event: 'message',
            priority: 1,
            rule: [
                { reg: /^[#\/][吃啃].*/, fnc: 'eat' }
            ]
        })
    }

    async eat(e) {
        // 非群无法游玩
        if (!e.isGroup) return e.reply(['该游戏只能在群内使用'])
        /** ID [群, 用户] */
        const ID = [e.group_id, e.user_id]
        /** 用户输入内容 */
        const USER_INPUT_CONTENT = e.msg.replace(/#|\/|吃|啃/g, '')
        /** 配置数据 */
        const configData = await readConfiguration()
        /** 默认物品 */
        let defaultItem = configData['bread_thing']
        /** 自定义物品 */
        const CUSTOM_ITEMS = configData['special_thing_group'][ID[0]]

        // 判断执行条件 [不存在自定义物品 同时 用户输入内容不为默认物品] 或者 [存在自定义物品 同时 用户输入内容不为自定义物品]
        if (!CUSTOM_ITEMS && USER_INPUT_CONTENT !== defaultItem || CUSTOM_ITEMS && USER_INPUT_CONTENT !== CUSTOM_ITEMS) return false
        // 存在自定义物品 默认物品修改为自定义物品
        if (CUSTOM_ITEMS) {
            defaultItem = CUSTOM_ITEMS
        }

        // 判断是否有此群文件夹，没有则创建
        if (!isGroupExist(ID[0])) { createAGroupFolder(ID[0]) }

        // 判断是否存在该用户，没有则创建基础信息
        if (!isPlayerExist(ID[0], ID[1])) {
            storagePlayerData(ID[0], ID[1], {
                name: e.sender.card || '未设置面包昵称',
                lv: 0,
                xp: 0,
                number: 0,
                cd: { buy: 0, eat: 0, rob: 0, give: 0, bet: 0 },
                log: { buy: [], eat: [], rob: [], give: [], bet: [] }
            })
        }

        /** 用户数据 */
        const USER_DATA = await getPlayerData(ID[0], ID[1])
        /** 用户面包数量 */
        const USER_NUMBER = USER_DATA['number']
        /** 当前秒 */
        const CURRENT_SECOND = timestampToSeconds(Date.now())
        /** 剩余CD */
        const REMAINING_TIME = CURRENT_SECOND - USER_DATA['cd']['eat']

        // 若剩余CD为负数，则CD还未结束，返回提示
        if (REMAINING_TIME < 0) {
            const { minutes, remainingSeconds } = convertSecToMinAndSec(Math.abs(REMAINING_TIME))
            if (minutes > 0) {
                return e.reply([`无法吃${defaultItem}，还有${minutes}分${remainingSeconds}秒`])
            } else {
                return e.reply([`无法吃${defaultItem}，还有${remainingSeconds}秒`])
            }
        }

        /** 吃到的面包数量 */
        let eatNumber = lodash.random(configData['min_eat'], configData['max_eat'])
        /** 返回消息 */
        let msg = `成功吃掉了${eatNumber}个${defaultItem}~\r现在你还剩${USER_NUMBER - eatNumber}个${defaultItem}!\r您目前的等级为Lv.${USER_DATA['lv']}`

        // 判断面包是否够吃
        if (USER_NUMBER < eatNumber) {
            return e.reply([`你的${defaultItem}还不够吃，来买一些吧`])
        }

        /** 1~0 之间的随机数 */
        const RANDOM_NUMBER = Math.random();
        /** 随机事件 */
        if (RANDOM_NUMBER < 0.01) {
            msg = `成功吃掉了${eatNumber}个${defaultItem}！吃到了超级${defaultItem}！等级加1`
            USER_DATA['lv'] += 1
        } else if (RANDOM_NUMBER < 0.015) {
            msg = `${defaultItem}坏啦！吃了一个坏${defaultItem}！难受死了，等级减1。`
            USER_DATA['lv'] -= 1
        } else if (RANDOM_NUMBER < 0.02) {
            msg = `成功吃掉了${eatNumber}个${defaultItem}！有个${defaultItem}超好吃！让你心情舒爽！所有操作刷新！`
            USER_DATA['cd'] = { buy: 0, eat: 0, rob: 0, give: 0, bet: 0 }
            configData['cd_eat'] = 0
        } else if (RANDOM_NUMBER < 0.025) {
            if (USER_NUMBER > configData['max_eat']) { // 触发条件 面包数量大于吃操作上限
                msg = `你刚想去吃${defaultItem}，发现自己${eatNumber}个${defaultItem}坏掉了！好难过，不想吃啦！`
                eatNumber = 0
            }
        } else if (RANDOM_NUMBER < 0.03) {
            msg = `成功吃掉了${eatNumber}个${defaultItem}！让你充满了力量！刷新抢的冷却！`
            USER_DATA['cd']['rob'] = 0
        } else if (RANDOM_NUMBER < 0.07) {
            msg = `你吃${defaultItem}被我发现了！我好饿，我帮你吃吧！吃了你${eatNumber}个${defaultItem}！`
            eatNumber = 0
        } else if (RANDOM_NUMBER < 0.1) {
            if (USER_NUMBER >= configData['max_eat'] * 2) { // 触发条件 面包数量大于吃操作上限*2
                msg = `成功吃掉了${eatNumber}个${defaultItem}！吃太多啦，撑死了，下次吃多等30分钟！`
                configData['max_eat'] += 1800
            }
        } else if (RANDOM_NUMBER < 0.2) {
            if (USER_NUMBER > 90) { // 触发条件 面包数量大于90
                msg += `\r你${defaultItem}太多啦，我允许你再吃一次吧！`
            } else {
                msg = `成功吃掉了${eatNumber}个${defaultItem}！还是好饿，还可以继续吃！`
            }
            configData['cd_eat'] = 0
        }


        // 用户数据处理 & 存储
        USER_DATA['cd']['eat'] = CURRENT_SECOND + configData['cd_eat']
        USER_DATA['log']['eat'].push(`[${getCurrentDate()}] 吃了${eatNumber}个${defaultItem}`)
        USER_DATA['number'] -= eatNumber
        // 判断升级
        USER_DATA['xp'] += eatNumber
        if (USER_DATA['xp'] >= configData['level_bread_num']) {
            USER_DATA['xp'] -= configData['level_bread_num']
            USER_DATA['lv'] += 1
            msg += `\r已经吃了${configData['level_bread_num']}个${defaultItem}！等级加1`
        }
        storagePlayerData(ID[0], ID[1], USER_DATA)

        // 返回吃面包结果
        return e.reply([msg])
    }
}